﻿using System;
using System.Drawing;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using BolsaTalentos.DataContextClasses;

namespace BolsaTalentos.BLL
{
    public class Empresa
    {
#warning Arreglar el manejo de las fotos

        // Campos
        private int id;
        private string rnc;
        private string nombre;
        private string direccion;
        private string descripcion;
        private bool siActiva;
        private Image foto;
        private DateTime fechaSolicitud;
        private Nullable<DateTime> fechaCreacion;
        private List<UsuarioEmpresa> usuarios;
        private List<Contacto> contactos;
        private List<Vacante> vacantes;
        private List<Envio> envios;
        private UsuarioAdministrativo usuarioCreador;

        // Propiedades
        public int ID
        {
            get { return this.id; }
        }
        public string RNC
        {
            get { return this.rnc; }
            set { this.rnc = value.Trim(); }
        }
        public string Nombre
        {
            get { return this.nombre; }
            set { this.nombre = value.Trim(); }
        }
        public string Direccion
        {
            get { return this.direccion; }
            set { this.direccion = value.Trim(); }
        }
        public string Descripcion
        {
            get { return this.descripcion; }
            set { this.descripcion = value.Trim(); }
        }
        public bool SiActiva
        {
            get { return this.siActiva; }
            set { this.SiActiva = value; }
        }
        public Image Foto
        {
            get { return this.foto; }
            set { this.foto = value; }
        }
        public DateTime FechaSolicitud
        {
            get { return this.fechaSolicitud; }
        }
        public Nullable<DateTime> FechaCreacion
        {
            get { return this.fechaCreacion; }
            set { this.fechaCreacion = value; }
        }
        public List<UsuarioEmpresa> Usuarios
        {
            get 
            {
                if (this.usuarios == null)
                {
                    this.usuarios = UsuarioEmpresa.GetUsuariosEmpresaByEmpresaID(this.ID);
                }
                return this.usuarios; 
            }
            set { this.usuarios = value; }
        }
        public List<Contacto> Contactos
        {
            get
            {
                if (this.contactos == null)
                {
                    this.contactos = Contacto.GetContactosByEmpresaID(this.ID);
                }
                return this.contactos;
            }
            set { this.contactos = value; }
        }
        public List<Vacante> Vacantes
        {
            get
            {
                if (this.vacantes == null)
                {
                    this.vacantes = Vacante.GetVacantesByEmpresaID(this.ID);
                }
                return this.vacantes;
            }
            set { this.vacantes = value; }
        }
        public List<Envio> Envios
        {
            get
            {
                if (this.envios == null)
                {
                    this.envios = Envio.GetEnviosByEmpresaID(this.ID);
                }
                return this.envios;
            }
            set { this.envios = value; }
        }
        public UsuarioAdministrativo UsuarioCreador
        {
            get
            {
                if (this.usuarioCreador == null)
                {
                    this.usuarioCreador = UsuarioAdministrativo.GetUsuarioCreadorByEmpresaID(this.ID);
                }
                return this.usuarioCreador;
            }
            set { this.usuarioCreador = value; }
        }

        // Constructores
        public Empresa(int IDToSearch)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.Empresa Emp = (from e in DB.Empresas
                                                  where e.ID == IDToSearch
                                                  select e).First();

                this.id = Emp.ID;
                this.rnc = Emp.RNC;
                this.nombre = Emp.Nombre;
                this.direccion = Emp.Direccion;
                this.descripcion = Emp.Descripcion;
                this.siActiva = Emp.Activa;
                this.fechaSolicitud = Emp.FechaSolicitud;
                this.fechaCreacion = Emp.FechaCreacion;//System.Convert.ToDateTime(Emp.FechaCreacion);         // el pajaro ete dike k no sabe convertir de DateTime? a DateTime
                //EmpresaToInsert.Foto = NewFoto;
                //this.usuarioCreador = new UsuarioAdministrativo(Emp.ID_UsuarioAdministrativo);      // must be lazy load ! cuidado si este campo el null
            }
            catch (Exception Ex)
            {
                throw new Exception("No existe tal empresa \n" + Ex.Message);
            }
        }
        public Empresa(string RNCToSearch) 
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.Empresa Emp = (from e in DB.Empresas
                                                  where e.RNC == RNCToSearch
                                                  select e).First();

                this.id = Emp.ID;
                this.rnc = Emp.RNC;
                this.nombre = Emp.Nombre;
                this.direccion = Emp.Direccion;
                this.descripcion = Emp.Descripcion;
                this.siActiva = Emp.Activa;
                this.fechaSolicitud = Emp.FechaSolicitud;
                this.fechaCreacion = Emp.FechaCreacion;//System.Convert.ToDateTime(Emp.FechaCreacion);         // el pajaro ete dike k no sabe convertir de DateTime? a DateTime
                //EmpresaToInsert.Foto = NewFoto;
                //this.usuarioCreador = new UsuarioAdministrativo(Emp.ID_UsuarioAdministrativo);      // must be lazy load ! cuidado si este campo el null
            }
            catch (Exception Ex)
            {
                throw new Exception("No existe tal empresa \n" + Ex.Message);
            }  
        }
        public Empresa(string NewNombre, string NewRNC, string NewDireccion, string NewDescripcion, Image NewFoto, int NewIDUsuarioCreador)
        {
            this.nombre = NewNombre;
            this.rnc = NewRNC;
            this.direccion = NewDireccion;
            this.descripcion = NewDescripcion;
            this.siActiva = true;
            //this.foto = NewFoto;
            this.usuarioCreador = new UsuarioAdministrativo(NewIDUsuarioCreador);
        }
        public Empresa(string NewNombre, string NewRNC, string NewDireccion, string NewDescripcion)
        {
            this.nombre = NewNombre;
            this.rnc = NewRNC;
            this.direccion = NewDireccion;
            this.descripcion = NewDescripcion;
            this.siActiva = false;
        }

        // Metodos
        public void Insertar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();
            try
            {
                DataContextClasses.Empresa EmpresaToInsert = new DataContextClasses.Empresa();

                EmpresaToInsert.Nombre = this.nombre;
                EmpresaToInsert.RNC = this.rnc;
                EmpresaToInsert.Direccion = this.direccion;
                EmpresaToInsert.Descripcion = this.descripcion;
                EmpresaToInsert.Activa = this.siActiva;
                EmpresaToInsert.FechaSolicitud = DateTime.Now;      // el pendejo <?> le mete la fecha por default 1/1/0001! y sql eplota

                if (this.siActiva)
                {
                    EmpresaToInsert.FechaCreacion = DateTime.Now;
                    EmpresaToInsert.ID_UsuarioAdministrativo = this.UsuarioCreador.ID;
                }

                //EmpresaToInsert.Foto = NewFoto;                

                DB.Empresas.InsertOnSubmit(EmpresaToInsert);

                DB.SubmitChanges();
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Hubo un problema con la Base de datos\n" + SqlEx.Message);
            }
        }
        public void Actualizar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();
            try
            {
                DataContextClasses.Empresa Emp = (from e in DB.Empresas
                                                  where e.ID == this.id
                                                  select e).First();

                Emp.Nombre = this.nombre;
                Emp.RNC = this.rnc;
                Emp.Direccion = this.direccion;
                Emp.Descripcion = this.descripcion;
                Emp.Activa = this.siActiva;
                Emp.FechaSolicitud = this.fechaSolicitud;      // el pendejo <?> le mete la fecha por default 1/1/0001! y sql eplota
                Emp.FechaCreacion = this.fechaCreacion;
                //EmpresaToInsert.Foto = NewFoto;
                Emp.ID_UsuarioAdministrativo = this.UsuarioCreador.ID;

                DB.SubmitChanges();
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Hubo un problema con la Base de datos\n" + SqlEx.Message);
            }
        }

        public void Activar(int IDUsuarioCreador)
        {
            this.siActiva = true;
            this.fechaCreacion = DateTime.Now;
            this.usuarioCreador = new UsuarioAdministrativo(IDUsuarioCreador);

            this.Actualizar();
        }
        public void AgregarContacto(int TipoContactoID, string ContactoDescripcion)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();
                DataContextClasses.Contacto ContactoToAdd = new DataContextClasses.Contacto();

                ContactoToAdd.ID_TipoContacto = TipoContactoID;
                ContactoToAdd.TipoUsuario = "Empresa";
                ContactoToAdd.ID_Usuario = this.ID;
                ContactoToAdd.Contacto1 = ContactoDescripcion;

                DB.Contactos.InsertOnSubmit(ContactoToAdd);
                DB.SubmitChanges();

                this.contactos = null;
            }
            catch (SqlException)
            {
                throw new Exception("Este contacto no se puede agregar, ya existe en la base de datos");
            }
        }
        public void EliminarContacto(int ContactoID)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.Contacto ContactoToDelete = (from c in DB.Contactos
                                                                where c.ID == ContactoID
                                                                select c).First();

                DB.Contactos.DeleteOnSubmit(ContactoToDelete);
                DB.SubmitChanges();

                this.contactos = null;
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Error en la base de datos. Intente en unos minutos" + SqlEx.Message);
            }
        }
        public void DesactivarUsuarioEmpresa(int UsuarioEmpresaID) 
        {
            try
            {
                UsuarioEmpresa UsuarioEmpresaToDeactivate = (from ue in this.Usuarios
                                                             where ue.ID == UsuarioEmpresaID
                                                             select ue).First();

                UsuarioEmpresaToDeactivate.ToggleActivation();
            }
            catch (Exception Ex) 
            {
                throw Ex;
            }
        }
        public void ActivarUsuarioEmpresa(int UsuarioEmpresaID)
        {
            try
            {
                UsuarioEmpresa UsuarioEmpresaToActivate = (from ue in this.Usuarios
                                                           where ue.ID == UsuarioEmpresaID
                                                           select ue).First();

                UsuarioEmpresaToActivate.ToggleActivation();
            }
            catch (Exception Ex)
            {
                throw Ex;
            }
        }

        public static Empresa GetPublicanteByVacanteID(int VacanteID)
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            DataContextClasses.Vacante Vac = (from v in DB.Vacantes
                                              where v.ID == VacanteID
                                              select v).First();

            Empresa Publicante = new Empresa(Vac.ID_Empresa);
            return Publicante;
        }

        public static List<Empresa> GetAllEmpresas() 
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();
                List<Empresa> ListEmpresaToReturn = new List<Empresa>();

                var QueryEmpresas = from e in DB.Empresas
                                    select e;

                foreach (DataContextClasses.Empresa item in QueryEmpresas)
                {
                    ListEmpresaToReturn.Add(new Empresa(item.ID));
                }

                return ListEmpresaToReturn;
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema con la Base de datos\n" + ex.Message);
            }
        }
    
    }
}
